package iface.aplicativo.util;

import iface.aplicativo.integracao.dao.FeriadoDAO;
import iface.aplicativo.negocio.entidade.Feriado;

import java.util.Calendar;
import java.util.Date;

public class FeriadoUtil {

	FeriadoDAO feriadoDAO;

	public static final Short DIA_UTIL = new Short((short) 0);
	public static final Short DIA_CORRIDO = new Short((short) 1);

	public FeriadoUtil(FeriadoDAO feriadoDAO) {
		super();
		this.feriadoDAO = feriadoDAO;
	}

	public Feriado consultarFeriado(Date dataConsulta) throws Exception {
		return feriadoDAO.consultarData(dataConsulta);
	}

	private boolean isDiaFeriado(Date dataConsulta) throws Exception {
		return this.consultarFeriado(dataConsulta) != null;
	}

	public Date getDiaAnterior(Date dataConsulta, Short tipoDia)
			throws Exception {
		return getData(dataConsulta, tipoDia, (short) -1);
	}

	public Date getDiaPosterior(Date dataConsulta, Short tipoDia)
			throws Exception {
		return getData(dataConsulta, tipoDia, (short) 1);
	}

	private Date getData(Date dataConsulta, Short tipoDia, short quantidade)
			throws Exception {
		Calendar calendario = Calendar.getInstance();
		calendario.setTime(dataConsulta);

		if (DIA_UTIL.equals(tipoDia)) {
			while (isDiaFeriado(dataConsulta)) {
				calendario.roll(Calendar.DAY_OF_MONTH, quantidade);
				dataConsulta = calendario.getTime();
			}

			if (calendario.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY) {
				// Dia posterior
				if (quantidade > 0) {
					calendario.roll(Calendar.DAY_OF_MONTH, (quantidade * 2));
				} else { // Dia anterior
					calendario.roll(Calendar.DAY_OF_MONTH, quantidade);
				}
			} else if (calendario.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {
				// Dia posterior
				if (quantidade > 0) {
					calendario.roll(Calendar.DAY_OF_MONTH, quantidade);
				} else { // Dia anterior
					calendario.roll(Calendar.DAY_OF_MONTH, (quantidade * 2));
				}
			}

			dataConsulta = calendario.getTime();
			if (isDiaFeriado(dataConsulta)) {
				return getData(dataConsulta, tipoDia, quantidade);
			}
		} else {
			calendario.roll(Calendar.DAY_OF_WEEK, quantidade);
		}

		return calendario.getTime();
	}
}
